import { Controller, Get, Post, Body, Patch, Param, Delete, UseInterceptors, UploadedFile, Res } from '@nestjs/common';
import { UploadService } from './upload.service';
import { CreateUploadDto } from './dto/create-upload.dto';
import { UpdateUploadDto } from './dto/update-upload.dto';

import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express';
import type { Response } from 'express';
import { join } from 'path';
import { zip } from 'compressing';

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  // 上传接口
  @Post('upstrem')
  @UseInterceptors(FileInterceptor('file'))    // 使用中间件拦截处理上传的文件，传字段，单个文件FileInterceptor，多个文件FilesInterceptor
  upload(@UploadedFile() file){
    console.log(file);
    return '文件上传成功'
  }

  // 文件下载
  @Get('export')
  download(@Res() res: Response) {

    const url = join(__dirname, '../file/xxx')   // 将上一节上传的文件的地址路径拿过来拼接
    res.download(url)
  }

  // 文件流下载
  @Get('stream')
  async downloadStream(@Res() res: Response) {
    // 安装 compressing, 使用里面的 zip 方法
    const tarStream = new zip.Stream()
    const url = join(__dirname, '../file/xxx')
    await tarStream.addEntry(url)

    res.setHeader('Content-Type', 'application/octet-stream')  // 设置响应头 改成流响应
    res.setHeader('Content-Disposition', 'attachment; filename=xxx')    // 设置响应头，下载名称设置成文件名称

    tarStream.pipe(res)   // 管道流， 返给前端的是一个流，需要前端处理一下，参考 nodejs 里的 file 部分
  }

  // @Post()
  // create(@Body() createUploadDto: CreateUploadDto) {
  //   return this.uploadService.create(createUploadDto);
  // }

  // @Get()
  // findAll() {
  //   return this.uploadService.findAll();
  // }

  // @Get(':id')
  // findOne(@Param('id') id: string) {
  //   return this.uploadService.findOne(+id);
  // }

  // @Patch(':id')
  // update(@Param('id') id: string, @Body() updateUploadDto: UpdateUploadDto) {
  //   return this.uploadService.update(+id, updateUploadDto);
  // }

  // @Delete(':id')
  // remove(@Param('id') id: string) {
  //   return this.uploadService.remove(+id);
  // }
}
